package cn.itcast.web.controller.cargo;

import cn.itcast.domain.cargo.Contract;
import cn.itcast.domain.cargo.ContractExample;
import cn.itcast.domain.system.Dept;
import cn.itcast.domain.system.User;
import cn.itcast.service.cargo.ContractService;
import cn.itcast.web.controller.BaseController;
import com.alibaba.dubbo.config.annotation.Reference;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;

/**
 * 购销合同的web层（消费者）
 */
@Controller
@RequestMapping("/cargo/contract")
public class ContractController extends BaseController {

	@Reference
	private ContractService contractService;

	/**
	 * 分页
	 */
	@RequestMapping("/list")
	public String list(@RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "5")int size) {
		//1.创建example
		ContractExample example = new ContractExample();
		//2.通过example创建criteria对象
		ContractExample.Criteria criteria = example.createCriteria();
		//3.向criteria对象设置条件
		criteria.andCompanyIdEqualTo(getLoginCompanyId());

		/**
		 * 细粒度的权限控制
		 *  不同的人员，拼接不同的条件
		 *  用户通过dgree字段划分为
		 *     1：管理员
		 *     2：管理下属部门和部门
		 *     3：部门经理       --  查询当前部门下的所有合同
		 *     4：普通员工       --  查询自己签订的合同
		 */
		User user = getLoginUser();
		Integer degree = user.getDegree();
		if (degree==4) {
			//4：普通员工       --  查询自己签订的合同(创建人id查询)
			criteria.andCreateByEqualTo(user.getId());
		}else if(degree==3) {
			//3：部门经理       --  查询当前部门下的所有合同（创建人部门）
			criteria.andCreateDeptEqualTo(user.getDeptId());
		}else if(degree == 2) {
			//2：管理下属部门和本部门（查询所有当前部门和下属部门的数据），借助模糊查询
			criteria.andCreateDeptLike(user.getDeptId() + "%");
		}
		//4.发起调用
		//设置排序
		example.setOrderByClause("create_time DESC");

		PageInfo info = contractService.findAll(page, size, example);
		request.setAttribute("page",info);
		//跳转页面
		return "cargo/contract/contract-list";
	}

	//进入到保存页面
	@RequestMapping("/toAdd")
	public String toAdd() {
		return "cargo/contract/contract-add";
	}

	//进入修改页面
	@RequestMapping("/toUpdate")
	public String toUpdate(String id) {
		//1.根据id查询
		Contract contract = contractService.findById(id);
		request.setAttribute("contract",contract);
		return "cargo/contract/contract-update";
	}


	//修改或者保存
	@RequestMapping("/edit")
	public String edit(Contract contract) {
		//1.设置企业属性
		contract.setCompanyId(getLoginCompanyId());
		contract.setCompanyName(getLoginCompanyName());
		//2.判断是否具有id
		if (StringUtils.isEmpty(contract.getId())) {
			//3.没有id，调用service保存
			//设置购销合同的创建人和创建人部门（当前登录用户获取）
			User user = getLoginUser();
			contract.setCreateBy(user.getId()); //创建人id
			contract.setCreateDept(user.getDeptId()); //创建人所在部门id
			contractService.save(contract);
		}else {
			//4.存在id，调用service更新
			contractService.update(contract);
		}
		//5.重定向到列表
		return  "redirect:/cargo/contract/list.do";
	}

	/**
	 * 提交：修改状态由 0--1
	 */
	@RequestMapping("/submit")
	public String submit(String id) {
		//1.根据id查询购销合同
		//2.判断状态（状态是0，可以修改）
		//3.设置状态
		//4.更新数据库

		Contract contract = new Contract();
		contract.setId(id);
		contract.setState(1);
		contractService.update(contract);  //底层：非空更新   update table set state = 1 where id=xxxx
		return  "redirect:/cargo/contract/list.do";
	}

	/**
	 * 取消：修改状态由 1--0
	 */
	@RequestMapping("/cancel")
	public String cancel(String id) {
		//1.根据id查询购销合同
		//2.判断状态（状态是0，可以修改）
		//3.设置状态
		//4.更新数据库

		Contract contract = new Contract();
		contract.setId(id);
		contract.setState(0);
		contractService.update(contract);  //底层：非空更新   update table set state = 1 where id=xxxx
		return  "redirect:/cargo/contract/list.do";
	}

	//删除
	@RequestMapping("/delete")
	public String delete(String id) {
		contractService.delete(id);
		return  "redirect:/cargo/contract/list.do";
	}
}
